因為出國玩不小心中斷了... 不過還是有一些內容想繼續研究的,就還是打算盡力完成這次的系列文吧~
昨日我們透過 kubeadm config
指令產生了 config 檔案用於初始化,但若是後續要調整設定的話要如何做呢?來看看官方的建議吧 ~
kubeadm
建立的 clusterhttps://kubernetes.io/docs/tasks/administer-cluster/kubeadm/
這個章節主要包含以下重點:
kubeadm
目前還沒辦法自動化的調整配置,需要自己使用 operator 的方式實作
前置作業如下:
kubeadm
建立的 cluster/etc/kubernetes/admin.conf
),並且可以連線至 kube-apiserver
可透過以下指令修改 k8s cluster 內的元件,並指定編輯器:
KUBECONFIG=/etc/kubernetes/admin.conf KUBE_EDITOR=nano kubectl edit <parameters>
而修改完配置後,cluster 內的配置通常不會直接更新,需要手動執行指令,下面會再講各種不同情況如何處理。
ClusterConfiguration
ClusterConfiguration
的欄位是存在 configmap
中,可使用以下指令修改:
kubectl edit cm -n kube-system kubeadm-config
目前我們的 cluster 還沒修改過,所以內容就跟初始化時大同小異:
apiVersion: v1
data:
ClusterConfiguration: |
...
controlPlaneEndpoint: 192.168.75.10:6443
controllerManager: {}
dns: {}
scheduler: {}
kind: ConfigMap
metadata:
name: kubeadm-config
namespace: kube-system
在 ClusterConfiguration
的欄位中包含了 control plane 元件的修改,上述因為沒有調整的關係,可看到 scheduler, controllerManager
都是 {} (空物件)
extraArgs
:要帶入 control plane 元件的參數, requires updating the list of flags passed to a component containerextraVolumes
- requires updating the volume mounts for a component containerSANs
- requires writing new certificates with updated Subject Alternative Names官方文件在介紹完 kubectl edit cm -n kube-system kubeadm-config
之後,是透過以下指令套用:
# For Kubernetes control plane components
kubeadm init phase control-plane <component-name> --config <config-file>
# For local etcd
kubeadm init phase etcd local --config <config-file>
有點有趣的是,上面是修改 k8s 的 configmap,結果這邊的指令需要指定一個 config-file,官方沒有解釋如何取得
我們可以透過 kubectl get
的方式拿到,如下範例:
kubectl get cm -n kube-system kubeadm-config -o jsonpath={.data.ClusterConfiguration} > config.yaml
kubeadm init phase control-plane apiserver --config ./config.yaml
執行完指令後,該節點上的 /etc/kubernetes/manifest
檔案就會調整為 config 的內容。
除了
kubeadm init phase
外,筆者也會使用kubeadm upgrade node
,但指定同版本的方式來更新 control plane 的配置。
因為在更新過程中,會透過ClusterConfiguration
來配置 manifest
kubelet
與 kubeadm
雷同,也是先修改 configmap:
kubectl edit cm -n kube-system kubelet-config
kubelet
的更新步驟就比較完整了:
kubeadm
的節點kubeadm upgrade node phase kubelet-config
指令,會直接把檔案載入至 /var/lib/kubelet/config.yaml
/var/lib/kubelet/kubeadm-flags.env
調整一些額外的啟動參數(如果有的話)kubelet
: systemctl restart kubelet
kube-proxy
是透過 configmap 帶入,且是以 daemonset 帶起的服務,因此就是修改 configmap + 重啟服務即可:
# 編輯 configmap
kubectl edit cm -n kube-system kube-proxy
# 重啟 kube-proxy
kubectl -n kube-system rollout restart ds kube-proxy
CoreDNS 是用 deployment 帶起的服務,因此直接調整即可:
kubectl edit deployment -n kube-system coredns
kubectl edit service -n kube-system kube-dns
要特別注意當更新 k8s cluster 時,執行 kubeadm upgrade
會導致某些設定會被覆蓋,大致分成三項:
kubectl patch
的方式處理kubeadm upgrade
時加上 --patche
s 的參數,此 patch 檔案要與 ClusterConfiguration
持續同步kubeadm upgrade
時會使用 kubelet-config configMap
蓋過原本磁碟上的設定,必須在升級後手動更新,以及 /var/lib/kubelet/kubeadm-flags.env
,此檔案會蓋過相關的 KubeletConfiguration
選項 (但要確保某些 flags 沒有被棄用)kubeadm
指令的功能蠻多,也是目前最主流的安裝方式
之後應該會再把所有 kubeadm
的指令拿出來好好看看 ~~
https://kubernetes.io/docs/tasks/administer-cluster/kubeadm/
https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/control-plane-flags/#patches